package org.dromara.common.translation.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.dromara.common.translation.annotation.TranslationType;
import org.dromara.common.translation.core.TranslationInterface;
import org.dromara.common.translation.core.handler.TranslationBeanSerializerModifier;
import org.dromara.common.translation.core.handler.TranslationHandler;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfiguration;

import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * @Author 刘武贵
 * @Date 2024/8/15 22:00
 * @Description 功能描述：翻译模块配置类
 */
@Slf4j
@AutoConfiguration
public class TranslationConfig {

    /**
     * 翻译接口 (实现类需标注 {@link TranslationType} 注解标明翻译类型)
     */
    @Autowired
    private List<TranslationInterface<?>> list;

    /**
     * 注入JSON处理工具类，用于实体类与JSON字符串相互转换
     */
    @Autowired
    private ObjectMapper objectMapper;

    /**
     * 初始化
     */
    @PostConstruct
    public void init() {
        Map<String, TranslationInterface<?>> map = new HashMap<>(list.size());
        // 遍历列表中的所有翻译接口实例
        for (TranslationInterface<?> trans : list) {
            // 检查当前翻译接口实例的类是否标注了TranslationType注解
            if (trans.getClass().isAnnotationPresent(TranslationType.class)) {
                TranslationType annotation = trans.getClass().getAnnotation(TranslationType.class);
                // 将翻译接口实例按注解中的type值为键存储到Map中
                map.put(annotation.type(), trans);
            } else {
                log.warn(trans.getClass().getName() + " 翻译实现类未标注 TranslationType 注解!");
            }
        }
        // 将所有翻译接口实例添加到TranslationHandler的TRANSLATION_MAPPER中
        TranslationHandler.TRANSLATION_MAPPER.putAll(map);
        // 设置 Bean 序列化修改器
        // 设置Bean序列化修改器，以实现翻译字段的序列化功能
        objectMapper.setSerializerFactory(
            objectMapper.getSerializerFactory()
                .withSerializerModifier(new TranslationBeanSerializerModifier()));
    }

}
